<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		
	<span class="different-posts different-posts_earlier">📖 <a href="/page/57">earlier posts</a> 📖</span>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/60. iptables中DNAT、SNAT、和MASQUERADE的理解/">iptables中DNAT、SNAT、和MASQUERADE的理解</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IPtables中可以灵活的做各种网络地址转换（NAT），网络地址转换主要有两种：SNAT和DNAT</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SNAT是source network address translation的缩写，即源地址目标转换。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;比如，多个PC机使用ADSL路由器共享上网，每个PC机都配置了内网IP，PC机访问外部网络的时候，路由器将数据包的报头中的源地址替换成路由器的ip，当外部网络的服务器比如网站web服务器接到访问请求的时候，他的日志记录下来的是路由器的ip地址，而不是pc机的内网ip；</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这是因为，这个服务器收到的数据包的报头里边的“源地址”，已经被替换了所以叫做SNAT，基于源地址的地址转换。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DNAT是destination network address translation的缩写，即目标网络地址转换。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;典型的应用是，有个web服务器放在内网配置内网ip，前端有个防火墙配置公网ip，互联网上的访问者使用公网ip来访问这个网站当访问的时候，客户端发出一个数据包，这个数据包的报头里边，目标地址写的是防火墙的公网ip，防火墙会把这个数据包的报头改写一次，将目标地址改写成web服务器的内网ip，然后再把这个数据包发送到内网的web服务器上，这样，数据包就穿透了防火墙，并从公网ip变成了一个对内网地址的访问了，即DNAT，基于目标的网络地址转换。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MASQUERADE，地址伪装，在iptables中有着和SNAT相近的效果，但也有一些区别，但使用SNAT的时候，出口ip的地址范围可以是一个，也可以是多个，例如：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这就是SNAT的使用方法，即可以NAT成一个地址，也可以NAT成多个地址，但是，对于SNAT，不管是几个地址，必须明确的指定要SNAT的ip。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;假如当前系统用的是ADSL动态拨号方式，那么每次拨号，出口ip192.168.5.3都会改变，而且改变的幅度很大，不一定是192.168.5.3到192.168.5.5范围内的地址，这个时候如果按照现在的方式来配置iptables就会出现问题了，因为每次拨号后，服务器地址都会变化，而iptables规则内的ip是不会随着自动变化的，每次地址变化后都必须手工修改一次iptables，把规则里边的固定ip改成新的ip，这样是非常不好用的。MASQUERADE就是针对这种场景而设计的，他的作用是，从服务器的网卡上，自动获取当前ip地址来做NAT。比如下边的命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如此配置的话，不用指定SNAT的目标ip了，不管现在eth0的出口获得了怎样的动态ip，MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去，这样就实现了很好的动态SNAT地址转换。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/6. Linux 用户名文件/">Linux 用户名文件</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Linux 用户名文件是 <code>/etc/passwd</code> 可以说是 Linux 系统中最重要的文件之一。如果这个文件出了问题，则无法正常登录 Linux 系统。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># cat /etc/passwd | head</span></div><div class="line">root:x:0:0:root:/root:/bin/bash</div><div class="line">bin:x:1:1:bin:/bin:/sbin/nologin</div><div class="line">daemon:x:2:2:daemon:/sbin:/sbin/nologin</div><div class="line">adm:x:3:4:adm:/var/adm:/sbin/nologin</div><div class="line">lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</div><div class="line">sync:x:5:0:sync:/sbin:/bin/sync</div><div class="line">shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown</div><div class="line">halt:x:7:0:halt:/sbin:/sbin/halt</div><div class="line">mail:x:8:12:mail:/var/spool/mail:/sbin/nologin</div><div class="line">uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;“head” 前面的 “|” 叫做管道符，它的作用是把前面的命令的输出再输入给后面的命令。</p>
<h2 id="用户名文件每个字段的含义"><a href="#用户名文件每个字段的含义" class="headerlink" title="用户名文件每个字段的含义"></a>用户名文件每个字段的含义</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<code>/etc/passwd</code> 由 <code>：</code> 分割成 7 个字段，每个字段的含义是：<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>1.用户名</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如第一行中的 root 就是用户名，代表用户帐号的字符串。用户名字符串可以是大小写字母、数字、减号（不能出现在首位）、点以及下划线，其他字符不合法。虽然用户名中可以出现点，但不建议使用，尤其是首位为点时，另外减号也不建议使用，因为庸医造成混淆。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>2.帐号口令</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;第二字段存放的就是该帐号的口令。为什么是 ‘x’ 呢？早起的 unix 系统口令是存放在这里，但基于安全因素，后来就将其到 ‘/etc/shadow’ 中了，这里只用一个 ‘x’ 代替。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>3.用户标识号</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个数字代表用户标识号，也叫做 uid 。系统识别用户身份就是通过这个数字， 0 就是 root ，也就是说可以修改 test 用户的 uid 为 0 ，那么系统就会认为 root 和 test 为同一个账户。通常 uid 的取值范围是 0-65535 （但实际上已经可以支持到 4294967294），0 是超级用户 （root）的表示号，1-499 有系统保留，作为管理帐号，普通用户的表示号从 500 开始，如果自定义建立一个普通用户，可以看到该账户的标识号是大于或等于 500 的。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>4.组表示号</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个数字表示组标识号，也叫做 gid 这个字段对应着 /etc/group 中的一条记录，其实 /etc/group 和 /etc/passwd 基本上类似。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>5.注释说明</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该字段没有实际意义，通常记录该用户的一些属性，例如姓名、电话、地址等等。不过，当使用 finger 的功能时就回显示这些信息。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>6.用户家目录</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当用户登录时就处在这个目录下。 root 的家目录是 /root，普通用户的家目录则为 /home/username ，这个字段是可以自定义的，比如建立一个普通用户 test1 ，要想让 test1 的家目录在 /data 目录下，只要修改 /etc/passwd 文件中的 test1 那行中的该字段为 /data 即可。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>7.shell</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用户登录后要启动一个进程，用来将用户下达的指令传给内核，这就是 shell 。Linux 的 shell 有很多中 sh 、csh 、ksh 、tcsh 、bash等，而 Redhat /CentOS 的 shell 就是 bash 。查看 /etc/passwd 文件，该字段中除了 /bin/bash 外还有 /sbin/nologin 比较多，它表示不允许该帐号登录。如果想建立一个帐号不让它登录，那么就可以把该字段改成 /sbin/nologin 默认是 /bin/bash。</p>
<h2 id="chfn-更改用户的-finger"><a href="#chfn-更改用户的-finger" class="headerlink" title="chfn 更改用户的 finger"></a>chfn 更改用户的 finger</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在 /etc/passwd 文件中的第五个字段中所显示的信息，如何去设定：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># chfn user11</span></div><div class="line">Changing finger information <span class="keyword">for</span> user11.</div><div class="line">Name []: user11</div><div class="line">Office []: user11<span class="string">'s office</span></div><div class="line"><span class="string">Office Phone []: 12345678</span></div><div class="line"><span class="string">Home Phone []: 123456789</span></div><div class="line"><span class="string"></span></div><div class="line"><span class="string">Finger information changed.</span></div><div class="line"><span class="string">[root@localhost ~]# grep '</span>user11<span class="string">' /etc/passwd</span></div><div class="line"><span class="string">user11:x:510:502:user11,user11'</span>s office,12345678,123456789:/home/user11:/sbin/nologin</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;‘chfn’ 命令可以修改用户的findger信息，比如name, office, office phone 以及 Home phone.修改完后，就会在/etc/passwd文件中的user11的那一行第五个字段中看到相关信息了，默认是空的。“grep” 命令，它是用来过滤指定关键词的行</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/59. iptables中的DNAT、SNAT和MASQUERADE/">iptables中的DNAT、SNAT、和MASQUERADE</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DNAT（Destination Network Address Translation,目的地址转换) 通常被叫做目的映谢。而SNAT（Source Network Address Translation，源地址转换）通常被叫做源映谢。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这是在设置Linux网关或者防火墙时经常要用来的两种方式。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先，要了解一下IP包的结构，如下图所示：</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/iptables%E4%B8%ADDNAT%E3%80%81SNAT%E5%92%8CMASQUERADE/01.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在任何一个IP数据包中，都会有Source IP Address与Destination IP Address这两个字段，数据包所经过的路由器也是根据这两个字段是判定数据包是由什么地方发过来的，它要将数据包发到什么地方去。而iptables的DNAT与SNAT就是根据这个原理，对Source IP Address与Destination IP Address进行修改。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后，再看看数据包在iptables中要经过的链（chain）：</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/iptables%E4%B8%ADDNAT%E3%80%81SNAT%E5%92%8CMASQUERADE/02.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;图中正菱形的区域是对数据包进行判定转发的地方。在这里，系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。如果destination ip adress是本机地址，数据将会被转交给INPUT链。如果不是本机地址，则交给FORWARD链检测。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这也就是说，要做的DNAT要在进入这个菱形转发区域之前，也就是在PREROUTING链中做，比如要把访问202.103.96.112的访问转发到192.168.0.112上：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个转换过程当中，其实就是将已经达到这台Linux网关（防火墙）上的数据包上的destination ip address从202.103.96.112修改为192.168.0.112然后交给系统路由进行转发。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;而SNAT自然是要在数据包流出这台机器之前的最后一个链也就是POSTROUTING链来进行操作</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个语句就是告诉系统把即将要流出本机的数据的source ip address修改成为58.20.51.66。这样，数据包在达到目的机器以后，目的机器会将包返回到58.20.51.66也就是本机。如果不做这个操作，那么你的数据包在传递的过程中，reply的包肯定会丢失。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;假如当前系统用的是ADSL/3G/4G动态拨号方式，那么每次拨号，出口IP都会改变，SNAT就会有局限性。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;重点在那个『 MASQUERADE 』！这个设定值就是『IP伪装成为封包出去(-o)的那块装置上的IP』！不管现在eth0的出口获得了怎样的动态ip，MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去，这样就实现了很好的动态SNAT地址转换。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/58. 如何删除脚本中的汉字/">如何删除脚本中的汉字</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a> <a class="article__tag-link" href="/tags/正则表达式/">正则表达式</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;今天遇到个问题，脚本中参杂了中文汉字，现在需要删除所有汉字。以前在脚本中删除一两个汉字，那时手到擒来，匹配所有汉字还是第一次。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;汉字在计算机系统里是按照一定的编码格式表示的，就是常说的 GB2312、GB18030等，只要符合这个编码格式的就都是汉字了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;从GB2312-1980编码开始，汉字都是采用双字节编码。为 了与系统中基本的ASCII字符集区分开，所有汉字编码的每个字节的第一位都是1。GB2312的汉字编码规则为：第一个字节的值在0xb0到0xF7之间，第二个字节的值在0xAO到0xFE直接。由于GB13000是对GB2312的扩展，所以也被称为GBK。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;那么用sed把符合这些编码格式的用空替代就解决问题了。</p>
<p>sed的命令表达式：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sed -r <span class="string">"s/[\x81-\xFE][\x40-\xFE]//g"</span> file</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;执行以后发现有问题，原来系统的编码设置问题，更新一下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">LANG=C sed -r <span class="string">"s/[\x81-\xFE][\x40-\xFE]//g"</span> file</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;C代表英文环境ASCII编码格式，再次运行，一切OK。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/57. 用netstat查看网络状态详解/">用netstat查看网络状态详解</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/%E7%94%A8netstat%E6%9F%A5%E7%9C%8B%E7%BD%91%E7%BB%9C%E7%8A%B6%E6%80%81%E8%AF%A6%E8%A7%A3/01.png?raw=true" alt=""></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/%E7%94%A8netstat%E6%9F%A5%E7%9C%8B%E7%BD%91%E7%BB%9C%E7%8A%B6%E6%80%81%E8%AF%A6%E8%A7%A3/02.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;通常情况下:一个正常的TCP连接，都会有三个阶段:</p>
<ol>
<li>TCP三次握手;</li>
<li>数据传送;</li>
<li>TCP四次挥手</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注:以下说明最好能结合”图:TCP的状态机”来理解。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>SYN</strong>: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>ACK</strong>: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>FIN</strong>: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。</p>
<ol>
<li><p>LISTEN:首先服务端需要打开一个socket进行监听，状态为LISTEN. /<em> The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 </em>/</p>
</li>
<li><p>SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT. <code>/*The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求 */</code></p>
</li>
<li><p>SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV <code>/* A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 */</code></p>
</li>
<li><p>ESTABLISHED: 代表一个打开的连接，双方可以进行或已经在数据交互了。<code>/* The socket has an established connection. 代表一个打开的连接，数据可以传送给用户 */</code></p>
</li>
<li><p>FIN_WAIT1:主动关闭(active close)端应用程序调用close，于是其TCP发出FIN请求主动关闭连接，之后进入FIN_WAIT1状态.<code>/* The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求，或先前的连接中断请求的确认 */</code></p>
</li>
<li><p>CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后，就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT. <code>/* The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 */</code></p>
</li>
<li><p>FIN_WAIT2:主动关闭端接到ACK后，就进入了FIN-WAIT-2 .<code>/* Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求 */</code></p>
</li>
<li><p>LAST_ACK:被动关闭端一段时间后，接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . <code>/* The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认 */</code></p>
</li>
<li><p>TIME_WAIT:在主动关闭端接收到FIN后，TCP就发送ACK包，并进入TIME-WAIT状态。<code>/* The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认 */</code></p>
</li>
<li><p>CLOSING: 比较少见.<code>/* Both sockets are shut down but we still don’t have all our data sent. 等待远程TCP对连接中断的确认 */</code></p>
</li>
<li><p>CLOSED: 被动关闭端在接受到ACK包后，就进入了closed的状态。连接结束.<code>/* The socket is not being used. 没有任何连接状态 */</code></p>
</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TIME_WAIT状态的形成只发生在主动关闭连接的一方。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;主动关闭方在接收到被动关闭方的FIN请求后，发送成功给对方一个ACK后,将自己的状态由FIN_WAIT2修改为TIME_WAIT，而必须再等2倍 的MSL(Maximum Segment Lifetime,MSL是一个数据报在internetwork中能存在的时间)时间之后双方才能把状态 都改为CLOSED以关闭连接。目前RHEL里保持TIME_WAIT状态的时间为60秒。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当然上述很多TCP状态在系统里都有对应的解释或设置,可见man tcp</p>
<h2 id="关于长连接和短连接"><a href="#关于长连接和短连接" class="headerlink" title="关于长连接和短连接:"></a>关于长连接和短连接:</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;通俗点讲:短连接就是一次TCP请求得到结果后,连接马上结束.而长连接并不马上断开,而一直保持着,直到长连接TIMEOUT(具体程序都有相关参数说明).长连接可以避免不断的进行TCP三次握手和四次挥手.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;长连接(keepalive)是需要靠双方不断的发送探测包来维持的,keepalive期间服务端和客户端的TCP连接状态是ESTABLISHED.目前http 1.1版本里默认都是keepalive(1.0版本默认是不keepalive的)，ie6/7/8和firefox都默认用的是http 1.1版本了(如何查看当前浏览器用的是哪个版本，这里不再赘述)。Apache,java</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一个应用至于到底是该使用短连接还是长连接，应该视具体情况而定。一般的应用应该使用长连接。</p>
<h3 id="Linux的相关keepalive参数"><a href="#Linux的相关keepalive参数" class="headerlink" title="Linux的相关keepalive参数"></a>Linux的相关keepalive参数</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">a、 tcp_keepalive_time - INTEGER</div><div class="line">How often TCP sends out keepalive messages when keepalive is enabled.</div><div class="line">Default: 2hours.</div><div class="line">b、 tcp_keepalive_probes - INTEGER</div><div class="line">How many keepalive probes TCP sends out, until it decides that the</div><div class="line">connection is broken. Default value: 9.</div><div class="line">c、 tcp_keepalive_intvl - INTEGER</div><div class="line">How frequently the probes are send out. Multiplied by</div><div class="line">tcp_keepalive_probes it is time to <span class="built_in">kill</span> not responding connection,</div><div class="line">after probes started. Default value: 75sec i.e. connection</div><div class="line">will be aborted after ~11 minutes of retries.</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/%E7%94%A8netstat%E6%9F%A5%E7%9C%8B%E7%BD%91%E7%BB%9C%E7%8A%B6%E6%80%81%E8%AF%A6%E8%A7%A3/03.png?raw=true" alt=""></figure></p>
<h3 id="F5负载均衡上的相关参数说明"><a href="#F5负载均衡上的相关参数说明" class="headerlink" title="F5负载均衡上的相关参数说明"></a>F5负载均衡上的相关参数说明</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">a、Keep Alive Interval</div><div class="line">Specifies, when enabled, how frequently the system sends data over an idle TCP connection, to determine whether the connection is still valid.</div><div class="line">Specify: Specifies the interval at <span class="built_in">which</span> the system sends data over an idle connection, to determine whether the connection is still valid. The default is 1800 milliseconds.</div><div class="line">b、Time Wait</div><div class="line">Specifies the length of time that a TCP connection remains <span class="keyword">in</span> the TIME-WAIT state before entering the CLOSED state.</div><div class="line">Specify: Specifies the number of milliseconds that a TCP connection can remain <span class="keyword">in</span> the TIME-WAIT state. The default is 2000.</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/%E7%94%A8netstat%E6%9F%A5%E7%9C%8B%E7%BD%91%E7%BB%9C%E7%8A%B6%E6%80%81%E8%AF%A6%E8%A7%A3/04.png?raw=true" alt=""></figure></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">c、Idle Timeout</div><div class="line">Specifies the length of time that a connection is idle (has no traffic) before the connection is eligible <span class="keyword">for</span> deletion.</div><div class="line">Specify: Specifies a number of seconds that the TCP connection can remain idle before the system deletes it. The default is 300 seconds.</div></pre></td></tr></table></figure>
<h3 id="Apache的相关参数说明"><a href="#Apache的相关参数说明" class="headerlink" title="Apache的相关参数说明"></a>Apache的相关参数说明</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;以下是Apache/2.0.61版本的默认参数和说明</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">a、KeepAlive:</div><div class="line">default On.Whether or not to allow persistent connections (more than</div><div class="line">one request per connection). Set to “Off” to deactivate.</div><div class="line">b、MaxKeepAliveRequests:</div><div class="line">default 100.The maximum number of requests to allow</div><div class="line">during a persistent connection. Set to 0 to allow an unlimited amount.</div><div class="line">We recommend you leave this number high, <span class="keyword">for</span> maximum performance.</div><div class="line">c、KeepAliveTimeout:</div><div class="line">default 15. Number of seconds to <span class="built_in">wait</span> <span class="keyword">for</span> the next request from the</div><div class="line">same client on the same connection.</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/%E7%94%A8netstat%E6%9F%A5%E7%9C%8B%E7%BD%91%E7%BB%9C%E7%8A%B6%E6%80%81%E8%AF%A6%E8%A7%A3/05.png?raw=true" alt=""></figure></p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/56. Linux下的几个网络连接状态具体含义/">Linux下的几个网络连接状态具体含义</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<ol>
<li><p>LISTEN：首先服务端需要打开一个socket进行监听，状态为LISTEN。 /<em> The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 </em>/ </p>
</li>
<li><p>SYN_SENT：客户端通过应用程序调用connect进行active open，于是客户端TCP发送一个SYN以请求建立一个连接，之后状态置为SYN_SENT。 /<em>The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求 </em>/ </p>
</li>
<li><p>SYN_RECV：服务端应发出ACK确认客户端的SYN，同时自己向客户端发送一个SYN，之后状态置为SYN_RECV。 /<em> A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 </em>/ </p>
</li>
<li><p>ESTABLISHED：代表一个打开的连接，双方可以进行或已经在数据交互了。 /<em> The socket has an established connection. 代表一个打开的连接，数据可以传送给用户 </em>/ </p>
</li>
<li><p>FIN_WAIT1：主动关闭(active close)端应用程序调用close，于是其TCP发出FIN请求主动关闭连接，之后进入FIN_WAIT1状态。 /<em> The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求，或先前的连接中断请求的确认 </em>/ </p>
</li>
<li><p>CLOSE_WAIT：被动关闭(passive close)端TCP接到FIN后，就发出ACK以回应FIN请求（它的接收也作为文件结束符传递给上层应用程序），并进入CLOSE_WAIT。 /<em> The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 </em>/ </p>
</li>
<li><p>FIN_WAIT2：主动关闭端接到ACK后，就进入了FIN-WAIT-2。 /<em> Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求 </em>/ </p>
</li>
<li><p>LAST_ACK：被动关闭端一段时间后，接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个FIN，等待对方的ACK，就进入了LAST-ACK。 /<em> The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认 </em>/ </p>
</li>
<li><p>TIME_WAIT：在主动关闭端接收到FIN后，TCP就发送ACK包，并进入TIME-WAIT状态。 /<em> The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认 </em>/ </p>
</li>
<li><p>CLOSING：比较少见。 /<em> Both sockets are shut down but we still don’t have all our data sent. 等待远程TCP对连接中断的确认 </em>/ </p>
</li>
<li><p>CLOSED：被动关闭端在接受到ACK包后，就进入了CLOSED的状态，连接结束。 /<em> The socket is not being used. 没有任何连接状态 </em>/</p>
</li>
</ol>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/55. Linux查看网卡速度调整工作模式/">Linux查看网卡速度调整工作模式</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查看网卡速度有两个命令都可以查看：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">mii-tool</div><div class="line">eth0: negotiated 1000baseT-FD flow-control, link ok</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这表示，eth0网卡的速度为1000M，并且是全双工工作模式，也可以使用</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div></pre></td><td class="code"><pre><div class="line">ethtool eth0</div><div class="line">Settings <span class="keyword">for</span> eth0:</div><div class="line"> Supported ports: [ TP ]</div><div class="line"> Supported link modes: 10baseT/Half 10baseT/Full</div><div class="line"> 100baseT/Half 100baseT/Full</div><div class="line"> 1000baseT/Full</div><div class="line"> Supports auto-negotiation: Yes</div><div class="line"> Advertised link modes: 10baseT/Half 10baseT/Full</div><div class="line"> 100baseT/Half 100baseT/Full</div><div class="line"> 1000baseT/Full</div><div class="line"> Advertised auto-negotiation: Yes</div><div class="line"> Speed: 1000Mb/s</div><div class="line"> Duplex: Full</div><div class="line"> Port: Twisted Pair</div><div class="line"> PHYAD: 0</div><div class="line"> Transceiver: internal</div><div class="line"> Auto-negotiation: on</div><div class="line"> Supports Wake-on: umbg</div><div class="line"> Wake-on: g</div><div class="line"> Current message level: 0x00000007 (7)</div><div class="line"> Link detected: yes</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Speed 后边的数值就是速度，Duplex后边就是工作不是，full表示全双工，如果是half则表示半双工模式；Auto-negotiation 后边表示是否自动协商</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;那么如何调整网卡的速度以及工作模式？</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;修改linux网卡的工作模式：</p>
<ul>
<li>ethtool –r ethX    重置ethX网口到自适应模式</li>
<li>ethtool –S ethX    查询ethX网口收发包统计</li>
<li>ethtool –s ethX [speed 10|100|1000]    设置网口速率10/100/1000M</li>
<li>[duplex half|full]                 设置网口半/全双工</li>
<li>[autoneg on|off]   设置网口是否自协商</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下面的命令会把eth0设置成全双工非自动协商工作模式，并且速度为100M</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ethtool -s eth0 duplex full autoneg off speed 100</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置网卡工作模式开机为全双工的方法：</p>
<ol>
<li>在/etc/sysconfig/network-script/ifcfg-ethX加入下面这句：</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ETHTOOL_OPTS=<span class="string">"speed 100 duplex full autoneg off"</span></div></pre></td></tr></table></figure>
<p>2.将上面的命令写入到/etc/rc.local里面。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ethtool -s eth0 duplex full autoneg off speed 100</div></pre></td></tr></table></figure>
	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/54. Linux下使用pmap指令查看进程的内存使用/">Linux下使用pmap指令查看进程的内存使用</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pmap这个指令是用来查看进程占用的内存及使用地址空间。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;常使用的选项为 -d ，如下查看进程 （pid为24030）的内存使用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">pmap -d 24030</div><div class="line">24030: /usr/<span class="built_in">local</span>/php/bin/php-cgi --fpm --fpm-config /usr/<span class="built_in">local</span>/php/etc/php-fpm.conf</div><div class="line">Address Kbytes Mode Offset Device Mapping</div><div class="line">0000000000400000 6444 r-x-- 0000000000000000 008:00002 php-cgi</div><div class="line">0000000000c4b000 272 rw--- 000000000064b000 008:00002 php-cgi</div><div class="line">0000000000c8f000 52 rw--- 0000000000c8f000 000:00000 [ anon ]</div><div class="line">00000000059dc000 9572 rw--- 00000000059dc000 000:00000 [ anon ]</div><div class="line">0000003519000000 508 r-x-- 0000000000000000 008:00002 libfreetype.so.6.3.10</div><div class="line">000000351907f000 2048 ----- 000000000007f000 008:00002 libfreetype.so.6.3.10</div><div class="line">中间部分省略</div><div class="line">00002b757df75000 4 rw--- 000000000000a000 008:00002 libnss_files-2.5.so</div><div class="line">00002b757df76000 32768 rw<span class="_">-s</span>- 0000000000000000 000:00008 zero (deleted)</div><div class="line">00002b7580685000 4 rw<span class="_">-s</span>- 0000000000000000 000:00008 zero (deleted)</div><div class="line">00007fff2e126000 476 rwx-- 00007fff2e126000 000:00000 [ stack ]</div><div class="line">00007fff2e19d000 8 rw--- 00007fff2e19d000 000:00000 [ anon ]</div><div class="line">ffffffffff600000 8192 ----- 0000000000000000 000:00000 [ anon ]</div><div class="line">mapped: 139548K writeable/private: 12344K shared: 32772K</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;每列的含义如下：</p>
<ul>
<li>Address: 进程所占的地址空间</li>
<li>Kbytes 该虚拟段的大小</li>
<li>Mode 权限：r=read, w=write, x=execute, s=shared, p=private(copy on write)</li>
<li>Mapping: bash 对应的映像文件名.要看的是最后一行的值</li>
<li>mapped 表示该进程映射的虚拟地址空间大小，也就是该进程预先分配的虚拟内存大小，即ps出的vsz</li>
<li>writeable/private  表示进程所占用的私有地址空间大小，也就是该进程实际使用的内存大小      </li>
<li>shared 表示进程和其他进程共享的内存大小</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Linux 会把一些shared libraries 载入到内存中，在pmap 的输出中，这些shared libraries 的名字通常是 lib*.so ,如 libX11.so.6.2.0 。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个 libX11.so.6.2.0 会被很多process load 到自己的运行环境中，同时，ps 输出的RSS 结果中，每个process 都包含了这个libX11.so.6.2.0 ，而事实上它只被load 了一次，如果单纯把ps 的结果相加，这样就重复计算了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;看pmap输出的结果，其实php-cgi 单纯进程所占的内存是这个writeable/private: 12344K</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/53. PS出的RSS总和大于实际物理内存/">PS出的RSS总和大于实际物理内存</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用ps  aux  查看系统进程时，第六列即 RSS列显示的就是进程使用的物理内存。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可是把系统所有进程的该列相加时，得到的总和又远远高于系统实际的物理内存？这到底是怎么回事呢？</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;看一看linux是如何管理内存的就会知道。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;理解的意思是这样的，linux会在每个进程生成时分配一定量的内存给这个进程，这个只是分配，而体现在ps出来的是VSZ那列，这叫做虚拟内存。但实际上这些进程并没有占用这些内存。不妨，我也借用网上的一个例子来形容一下，就像银行发工资给员工一样，每个员工都有一个自己的银行卡，每月银行都会把固定的钱数打到员工的银行卡里，但是这个过程并不是把实际的钱发到员工手里，只是一串数字而已。实际上，银行并没有那么多钱的。回头再来看看linux给进程分配内存是不是和上面的举的例子很像呢？</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;讲了上面的观点后，依然不能把笔者所设的问题解答，那么继续往下探讨：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;把系统所有进程的该列相加时，得到的总和又远远高于系统实际的物理内存？这是因为 ps 的结果，RSS 那部分，是包括共享内存的。这里使用 pmap 来看看。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">pmap -d 24030</div><div class="line">24030: /usr/<span class="built_in">local</span>/php/bin/php-cgi --fpm --fpm-config /usr/<span class="built_in">local</span>/php/etc/php-fpm.conf</div><div class="line">Address Kbytes Mode Offset Device Mapping</div><div class="line">0000000000400000 6444 r-x-- 0000000000000000 008:00002 php-cgi</div><div class="line">0000000000c4b000 272 rw--- 000000000064b000 008:00002 php-cgi</div><div class="line">0000000000c8f000 52 rw--- 0000000000c8f000 000:00000 [ anon ]</div><div class="line">00000000059dc000 9572 rw--- 00000000059dc000 000:00000 [ anon ]</div><div class="line">0000003519000000 508 r-x-- 0000000000000000 008:00002 libfreetype.so.6.3.10</div><div class="line">000000351907f000 2048 ----- 000000000007f000 008:00002 libfreetype.so.6.3.10</div><div class="line">中间部分省略</div><div class="line">00002b757df75000 4 rw--- 000000000000a000 008:00002 libnss_files-2.5.so</div><div class="line">00002b757df76000 32768 rw<span class="_">-s</span>- 0000000000000000 000:00008 zero (deleted)</div><div class="line">00002b7580685000 4 rw<span class="_">-s</span>- 0000000000000000 000:00008 zero (deleted)</div><div class="line">00007fff2e126000 476 rwx-- 00007fff2e126000 000:00000 [ stack ]</div><div class="line">00007fff2e19d000 8 rw--- 00007fff2e19d000 000:00000 [ anon ]</div><div class="line">ffffffffff600000 8192 ----- 0000000000000000 000:00000 [ anon ]</div><div class="line">mapped: 139548K writeable/private: 12344K shared: 32772K</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pmap是用来显示内存使用的指令，-d 后面跟的是进程id. 关于pmap的使用以及显示的数据请看<a href="http://www.lishiming.net/thread-977-1-1.html" target="_blank" rel="external">http://www.lishiming.net/thread-977-1-1.html</a> </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;linux 会把一些shared libraries 载入到内存中，在pmap 的输出中，这些shared      libraries 的名字通常是 lib*.so ,如 libX11.so.6.2.0 。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个 libX11.so.6.2.0 会被很多process load 到自己的运行环境中，同时，ps 输出的RSS 结果中，每个process 都包含了这个libX11.so.6.2.0 ，而事实上它只被load 了一次，如果单纯把ps 的结果相加，这样就重复计算了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;看pmap输出的结果，其实php-cgi 单纯进程所占的内存是这个writeable/private: 12344K</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/52. 详细说明Buffer和Cache的区别/">详细说明Buffer和Cache的区别</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;缓存（cached）是把读取过的数据保存起来，重新读取时若命中（找到需要的数据）就不要去读硬盘了，若没有命中就读硬盘。其中的数据会根据读取频率进行组织，把最频繁读取的内容放在最容易找到的位置，把不再读的内容不断往后排，直至从中删除。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;缓存（cache）实际并不是缓冲文件的，而是缓冲块的，块是磁盘I/O操作的最小单元。这样，目录、超级块、其它文件系统的薄记数据以及非文件系统的磁盘数据都可以被缓冲了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果缓存有固定的大小，那么缓存太大了也不好，因为这会使得空闲的内存太小而导致进行交换操作（这同样是慢的）。为了最有效地使用实际内存，Linux自动地使用所有空闲的内存作为高速缓冲，当程序需要更多的内存时，它也会自动地减小缓冲的大小。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;缓冲（buffers）是根据磁盘的读写设计的，把分散的写操作集中进行，减少磁盘碎片和硬盘的反复寻道，从而提高系统性能。linux有一个守护进程定期清空缓冲内容（即写磁盘），也可以通过sync命令手动清空缓冲。举个例子吧：我这里有一个ext2的U盘，我往里面cp一个3M的 MP3，但U盘的灯没有跳动，过了一会儿（或者手动输入sync）U盘的灯就跳动起来了。卸载设备时会清空缓冲，所以有些时候卸载一个设备时要等上几秒钟。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;两者都是RAM中的数据。简单来说，buffer是即将要被写入磁盘的，而cache是被从磁盘中读出来的。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;buffer是由各种进程分配的，由进程和系统一起管理.被用在如输入队列等方面，一个简单的例子如某个进程要求有多个字段读入，在所有字段被读入完整之前，进程把先前读入的字段放在buffer中保存。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cache经常被用在磁盘的I/O请求上，如果有多个进程都要访问某个文件，于是该文件便被做成cache以方便下次被访问，这样可提供系统性能。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;综上所述可以理解为cache系统管理, buffer由进程和系统一起管理.</p>

	

	

</article>





	<span class="different-posts">📖 <a href="/page/59">more posts</a> 📖</span>



	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
